package core

import (
	"lan-file-transfer/models"
	"os"
	"path/filepath"

	"github.com/spf13/viper"
)

// ConfigManager 配置管理器
type ConfigManager struct {
	config *models.Config
	v      *viper.Viper
}

// NewConfigManager 创建配置管理器
func NewConfigManager() *ConfigManager {
	v := viper.New()
	v.SetConfigName("config")
	v.SetConfigType("yaml")

	// 设置配置文件路径为可执行文件所在目录
	exePath, _ := os.Executable()
	exeDir := filepath.Dir(exePath)
	v.AddConfigPath(exeDir)
	v.AddConfigPath(".") // 也支持当前目录

	cm := &ConfigManager{
		config: models.DefaultConfig(),
		v:      v,
	}

	// 尝试读取配置文件
	if err := v.ReadInConfig(); err == nil {
		v.Unmarshal(&cm.config)
	}

	return cm
}

// GetConfig 获取配置
func (cm *ConfigManager) GetConfig() *models.Config {
	return cm.config
}

// SetPassword 设置密码
func (cm *ConfigManager) SetPassword(password string) {
	cm.config.Password = HashPassword(password)
}

// SetPort 设置端口
func (cm *ConfigManager) SetPort(port int) {
	cm.config.Port = port
}

// SetMaxConcurrent 设置最大并发数
func (cm *ConfigManager) SetMaxConcurrent(max int) {
	cm.config.MaxConcurrent = max
}

// AddSharedFile 添加共享文件路径
func (cm *ConfigManager) AddSharedFile(path string) {
	cm.config.SharedFiles = append(cm.config.SharedFiles, path)
}

// ClearSharedFiles 清空共享文件
func (cm *ConfigManager) ClearSharedFiles() {
	cm.config.SharedFiles = []string{}
}

// Save 保存配置
func (cm *ConfigManager) Save() error {
	cm.v.Set("password", cm.config.Password)
	cm.v.Set("port", cm.config.Port)
	cm.v.Set("max_concurrent", cm.config.MaxConcurrent)
	cm.v.Set("shared_files", cm.config.SharedFiles)

	// 获取配置文件路径
	exePath, _ := os.Executable()
	exeDir := filepath.Dir(exePath)
	configPath := filepath.Join(exeDir, "config.yaml")

	return cm.v.WriteConfigAs(configPath)
}
